This can create some bad situations because it allows you to 'starve' your I/O by making a recursive process.nextTick() calls, which prevents the event loop from reaching the poll phase.
setImmediate() is designed to execute a script once the current poll phase is completed.
setTimeout() schedules a script to be run after a minimum threshold in ms has elapsed. The order in which the timers are executed will vary depending on the context in which they are called. If both are called from within the main module, then the timing will be bound by the performance of the process (which can be impacted by other applications running on the machine).
The main advantage to using setImmediate() over setTimeout() is setImmediate() will always be executed before any timers if scheduled within an I/O cycle, independently of how many timers are present.